import APP from '@/config/base'
import Url from '@/config/whiteUrl.js'
import { getUserToken, getUserInfo, getProjectToken, getEnterToken, removeUserToken, removeUserInfo, removeEnterToken, removeEnterInfo, removeEnterStatus,removeAccessToken,removeProjectToken,removeProjectInfo } from '@/config/storage'
// 这里的Vue为Vue对象(非创建出来的实例)，vm为main.js中“Vue.use(httpInterceptor, app)”这一句的第二个参数，
// 为一个Vue的实例，也即每个页面的"this"
// 如果需要了解这个install方法是什么，请移步：https://uviewui.com/components/vueUse.html
const install = (Vue, vm) => {
	// 此为自定义配置参数，具体参数见上方说明
	Vue.prototype.$u.http.setConfig({
		baseUrl: APP.isTest ? APP.HOST.TEST.BASE_URL : APP.HOST.OFFICIAL.BASE_URL,
		loadingText: '努力加载中~',
		loadingTime: 800,
	});
	
	// 请求拦截，配置Token等参数
	Vue.prototype.$u.http.interceptor.request = (config) => {
		let token = ''
		if(getProjectToken()){
			console.log("project");
			token = getProjectToken()
		}else if(getEnterToken()){
			console.log("enterprise");
			token = getEnterToken()
		}else{
			console.log("app");
			token = getUserToken()
		}
		// 引用token
		config.header={
			'X-Token':token
		}
		
		// 根据配置的url白名单 设置请求时是否设置token信息
		for(let i in Url.whiteUrl){
			if(config.url == Url.whiteUrl[i]){
				config.header = {}
			}
		}
		
		// 进行数据AES加密
		config.data = APP.fnRequestDataEncrypt(config.data);
		// 如果return一个false值，则会取消本次请求
		// 最后需要将config进行return
		return config;
	}
	
	// 响应拦截，判断状态码是否通过
	Vue.prototype.$u.http.interceptor.response = (res) => {
		
		// AES解密
		res = APP.fnRequestDataDecrypt(res);
		
		if(res.code == 1|| res.code == 0) {
			// res为服务端返回值，可能有code，result等字段
			// 这里对res.result进行返回，将会在this.$u.post(url).then(res => {})的then回调中的res的到
			// 如果配置了originalData为true，请留意这里的返回值
			return res;
		}else if(res.code == 301003) {// token过期
			// 重新登录--在源码处修改
		}else {
			
			removeAccessToken();
			removeUserToken();
			removeEnterToken();
			removeProjectToken();
			removeUserInfo();
			removeEnterInfo();
			removeProjectInfo();
			
			uni.showToast({
				icon:'none',
				title: res.data
			})
			uni.reLaunch({
				url: '/pages/mine/login',
			})
			
			return false;
		}
	}
}

export default {
	install
}